package com.wn.wanflow

import android.app.Application
import android.content.Context
import androidx.multidex.MultiDex
import com.wn.framework.utils.AppExecutors
import com.wn.task.dispatcher.TaskDispatcher
import com.wn.wanflow.task.*
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject

/**
 * @Author: wn
 * @Date: 2024/8/12 15:53
 * @Description: 应用类
 */
@HiltAndroidApp
class MyApplication : Application() {
  @Inject
  lateinit var initAppHelperTask: InitAppHelperTask

  @Inject
  lateinit var initActivityLifecycleTask: InitActivityLifecycleTask

  @Inject
  lateinit var initMMKVTask: InitMMKVTask

  @Inject
  lateinit var initRefreshLayoutTask: InitRefreshLayoutTask

  @Inject
  lateinit var initARouterTask: InitARouterTask

  /**
   * 在 onCreate() 之前 调用, 添加或修改Context信息
   * 当 Android 应用程序包含太多的方法数时，会出现 "方法数超过 65536" 的编译错误
   * 这是由于 Android 操作系统对单个 Dex 文件（Dalvik Executable）的方法数有限制所致
   * 为了解决这个问题，Android 提供了 Multidex 支持
   */
  override fun attachBaseContext(base: Context?) {
    super.attachBaseContext(base)
    AppExecutors.cpuIO.execute {
      MultiDex.install(base)
    }
  }

  /**
   * 初始化一些任务
   * 1 注册 Activity 生命周期
   * 2 MMKV
   * 3 RefreshLayout
   * 4 ARouter
   */
  override fun onCreate() {
    super.onCreate()
    // 1.启动器：TaskDispatcher初始化
    TaskDispatcher.init(this)
    // 2.创建dispatcher实例 -- 每次都不一样
    TaskDispatcher.createInstance().apply {
      // 3.添加任务并且启动任务
      addTask(initAppHelperTask)
      addTask(initActivityLifecycleTask)
      addTask(initMMKVTask)
      addTask(initRefreshLayoutTask)
      addTask(initARouterTask)
      start()
      // 4.等待，需要等待的方法执行完才可以往下执行
      await()
    }
  }
}